home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / geom.c < prev    next >
C/C++ Source or Header  |  1991-03-08  |  5KB  |  271 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "art.h"
  4. #include "objs.h"
  5. #include "macro.h"
  6. #include "gram.h"
  7.  
  8. extern attr    *astackp;
  9. extern mats    *mstackp;
  10. extern float    tolerance;
  11.  
  12. extern hlist    *fhlist;
  13.  
  14. extern matrix    trans;
  15.  
  16. extern symbol    *findsym(), *insertsym();
  17.  
  18. extern int    lookatdone;
  19.  
  20. /*
  21.  * geometry file list
  22.  */
  23. static symbol    *geoms = (symbol *)NULL;
  24. static symbol    *colours = (symbol *)NULL;
  25. static symbol    *normals = (symbol *)NULL;
  26.  
  27. /*
  28.  * ray details
  29.  */
  30. static vector    dir, org;
  31. static float    orgu, orgv, diru, dirv;
  32.  
  33. /*
  34.  * ray box dimensions
  35.  */
  36. static float    minu, maxu, minv, maxv;
  37.  
  38. /*
  39.  * normals for the polygons
  40.  */
  41. static vector    *fnorms;
  42.  
  43. /*
  44.  * polygon object
  45.  */
  46. static object    *obj;
  47.  
  48. /*
  49.  * hitlist ptr for this object
  50.  */
  51. static hlist    *hitlist;
  52.  
  53. /*
  54.  * options
  55.  */
  56. static int    backfacing;
  57.  
  58. /*
  59.  * readgeometry
  60.  *
  61.  *    reads in and sets up a polygon model from a geometry file, care
  62.  * is taken to make sure the same file is not read in twice.
  63.  */
  64. readgeometry(name, geom, pnorms, vnorms)
  65.     char        *name;
  66.     geometry    **geom;
  67.     vector        **pnorms, **vnorms;
  68. {
  69.         float        minx, maxx, miny, maxy, minz, maxz;
  70.     float        *xs, *ys, *zs, midminv;
  71.     int        nverts, connections, npnts;
  72.     int        i, j, numedges, phong, delcount;
  73.     int        *ntris, *npolys, cvertno, bas, start, next;
  74.     vertno        *vertnums, *pntno;
  75.     FILE        *pfile;
  76.     vector        v, v1, v2, norm, *norms, *nrms;
  77.     facet        *face, **polys[DIMS], *faces;
  78.     unsigned char    *axis;
  79.     char        buf[BUFSIZ];
  80.     symbol        *sym;
  81.     geometry    *gm;
  82.  
  83.     if ((pfile = fopen(name, "r")) == NULL) {
  84.         sprintf(buf, "art: cannot open offfile %s.\n", name);
  85.         fatal(buf);
  86.     }
  87.  
  88.     if (fscanf(pfile, "%d %d %d\n", &nverts, &connections, &numedges) != 3) {
  89.         sprintf(buf, "art: can't find header info in offfile %s.\n", name);
  90.         fatal(buf);
  91.     }
  92.  
  93.     xs = (float *)smalloc(sizeof(float) * nverts);
  94.     ys = (float *)smalloc(sizeof(float) * nverts);
  95.     zs = (float *)smalloc(sizeof(float) * nverts);
  96.  
  97.     fscanf(pfile, "%f %f %f\n", &v1.x, &v1.y, &v1.z);
  98.  
  99.     minx = maxx = v1.x;
  100.     miny = maxy = v1.y;
  101.     minz = maxz = v1.z;
  102.     xs[0] = v1.x; ys[0] = v1.y; zs[0] = v1.z;
  103.  
  104.     for (i = 1; i != nverts; i++) {
  105.         fscanf(pfile, "%f %f %f\n", &v1.x, &v1.y, &v1.z);
  106.         minmax(minx, maxx, v1.x);
  107.         minmax(miny, maxy, v1.y);
  108.         minmax(minz, maxz, v1.z);
  109.         xs[i] = v1.x; ys[i] = v1.y; zs[i] = v1.z;
  110.     }
  111.  
  112.     pushmatrix();
  113.  
  114.         calctransforms(mstackp);
  115.         multmatrix(mstackp->obj2ray);
  116.  
  117.         delcount = cvertno = 0;
  118.         for (i = 0; i != connections; i++) {
  119.             fscanf(pfile, "%d", &npnts);
  120.             fscanf(pfile, "%d", &start);
  121.             start -= 1;
  122.  
  123.             move(xs[start], ys[start], zs[start]);
  124.             
  125.             for (j = 1; j != npnts; j++) {
  126.                 fscanf(pfile, "%d", &next);
  127.                 next -= 1;
  128.                 draw(xs[next], ys[next], zs[next]);
  129.             }
  130.  
  131.             draw(xs[start], ys[start], zs[start]);
  132.         }
  133.  
  134.     popmatrix();
  135.  
  136.     free(xs);
  137.     free(ys);
  138.     free(zs);
  139.  
  140.     fclose(pfile);
  141. }
  142.  
  143. /*
  144.  * readcolours
  145.  *
  146.  *    read in the colour information for a geometry file
  147.  */
  148. readcolours(name, col, colindxs)
  149.     char        *name;
  150.     vector        **col;
  151.     unsigned short    **colindxs;
  152. {
  153.     FILE        *cfile;
  154.     int        numcols, numindexes, i;
  155.     vector        *cl;
  156.     unsigned short    *inds;
  157.     char        buf[BUFSIZ];
  158.     symbol        *sym;
  159.  
  160.     if ((cfile = fopen(name, "r")) == NULL) {
  161.         sprintf(buf, "art: cannot open colourfile %s.\n", name);
  162.         fatal(buf);
  163.     }
  164.  
  165.     fclose(cfile);
  166. }
  167.  
  168. /* 
  169.  * readnormals
  170.  *
  171.  *    read in the polygon normal information for a geometry file
  172.  */
  173. readnormals(name, norms)
  174.     char    *name;
  175.     vector    **norms;
  176. {
  177.     FILE        *nfile;
  178.     int        nnorms, i;
  179.     char        buf[BUFSIZ];
  180.     symbol        *sym;
  181.     vector        *nrms;
  182.  
  183.     if ((nfile = fopen(name, "r")) == NULL) {
  184.         sprintf(buf, "art: cannot open normalfile %s.\n", name);
  185.         fatal(buf);
  186.     }
  187.  
  188.     fclose(nfile);
  189. }
  190.  
  191. /* 
  192.  * readvnormals
  193.  *
  194.  *    read in the vertex normal information for a geometry file
  195.  */
  196. readvnormals(name, norms, ntable)
  197.     char    *name;
  198.     vector    **norms;
  199.     vertno    ***ntable;
  200. {
  201.     FILE        *nfile;
  202.     int        nnorms, npolys, nedges, i, j, npoints, cvertno;
  203.     char        buf[BUFSIZ];
  204.     symbol        *sym;
  205.     vector        *nrms;
  206.     vertno        **ntbl, *verts, *pntno;
  207.  
  208.     if ((nfile = fopen(name, "r")) == NULL) {
  209.         sprintf(buf, "art: cannot open vnormalfile %s.\n", name);
  210.         fatal(buf);
  211.     }
  212.  
  213.     if (fscanf(nfile, "%d %d %d ", &nnorms, &npolys, &nedges) != 3) {
  214.         sprintf(buf, "art: bad header in vnormalfile %s.\n", name);
  215.         fatal(buf);
  216.     }
  217.  
  218.     fclose(nfile);
  219. }
  220.  
  221. /*
  222.  * geometryinit
  223.  *
  224.  *    sets up a geometry object, this is always a geometry file.
  225.  */
  226. void
  227. geometryinit(o, d)
  228.     object    *o;
  229.     details    *d;
  230. {
  231.     details        *ld;
  232.     float        radius;
  233.     vector        *cols;
  234.     unsigned short    *colindexes;
  235.     vector        c1, c2, cent, *pnorms1, *pnorms2, *vnorms1, *vnorms2;
  236.     vertno        **vnormtab;
  237.     geometry    *geom;
  238.  
  239.     cols = (vector *)NULL;
  240.     colindexes = (unsigned short *)NULL;
  241.  
  242.     vnorms1 = vnorms2 = (vector *)NULL;
  243.     pnorms1 = pnorms2 = (vector *)NULL;
  244.     vnormtab = (vertno **)NULL;
  245.  
  246.     if (!lookatdone)
  247.         deflookat();
  248.  
  249.     while (d != (details *)NULL) {
  250.         switch (d->type) {
  251.         case OFFFILE:
  252.             readgeometry(d->u.s);
  253.             break;
  254.         case COLOURFILE:
  255.             readcolours(d->u.s);
  256.             break;
  257.         case NORMALFILE:
  258.             readnormals(d->u.s);
  259.             break;
  260.         case VNORMALFILE:
  261.             readvnormals(d->u.s);
  262.             break;
  263.         default:
  264.             warning("art: illegal field in geometry ignored.\n");
  265.         }
  266.         ld = d;
  267.         d = d->nxt;
  268.         free(ld);
  269.     }
  270. }
  271.